iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0
自我挑戰組

純新手學習 JavaScript系列 第 17

新手學習JavaScript:day17 - 演算法與時間複雜度

  • 分享至 

  • xImage
  •  

接下來幾天讓我們挑戰看看leetcode的一些基本題目吧!不過在這之前讓我們來先介紹一下演算法與時間複雜度。

什麼是演算法?

根據維基百科:

演算法(algorithm),在數學(算學)和電腦科學之中,為任何良定義的具體計算步驟的一個序列,常用於計算、資料處理和自動推理。精確而言,演算法是一個表示爲有限長,列表的有效方法。演算法應包含清晰定義的指令,用於計算函式。

相信看完上面那段應該還是不太了解什麼是演算法,讓我們來簡化一下:

演算法是一個有輸入跟輸出,且具有明確和有限能夠解決問題的步驟。

再用簡單用一句話來形容就是:

輸入一個東西,想要得到另外一個東西,經過的過程就是所謂的演算法。

讓我們用「炒菜」來解釋解釋,炒一盤青菜可能會需要這些步驟:

  1. 放油到鍋子
  2. 放蒜下去爆香
  3. 放下青菜
  4. 放入一匙鹽巴
  5. 如果喜歡加入一點辣椒
  6. 然後大火快炒翻鍋5遍
  7. 美味的青菜完成

我們把食材丟下去,透過清楚明確的有限步驟,我們能得出一盤青菜。

在認識了演算法基本的定義後,就讓我們進一步來認識什麼是時間複雜度?

時間複雜度

我們遇到同一個問題,解決的方法可能會有很多種,那怎麼評斷方法的好壞?這個時候就需要指標。評斷指標有兩個:

  1. 時間複雜度(花的時間)
  2. 空間複雜度(佔的空間)

今天我們來介紹時間複雜度,那時間複雜度通常用大 O 符號(Big O notation)來記錄時間複雜度的快慢。

讓我們直接來看範例:

function plus(num){
  return num + 2;
}

上面的範例來說演算法執行的步驟是固定的,無關輸入的值而改變,那我們會記成 O(1)。

範例2:

for(var i = 0; i < n; i++){
    console.log(i);
}

範例2,可以發現for迴圈指行的次數會隨著n的值而改變,所以會記成 O(n)。

範例3:

for(var i = 0; i < n; i++){
    for(var j = 0; j < n-1; j++){
        console.log(i * j)
    }
}

範例3跑了 n×(n−1)=n2−n 次,但還是會記做 O(n^2) ,只取最高次方。

除了上面三個範例外還有其他的時間複雜度:

  • O(logn)
  • O(nlogn)
  • O(2^n)

補充:

  • 通常會希望一個演算法至少能比 O(n^2) 還要快,如果能到 O(n)、O(1) 甚至是 O(log n) 的話是最理想的情況。
  • 演算法的速度不是以秒計算,而是以步驟次數。

以上是今天對於基本演算法與時間複雜度介紹,明天讓我回來介紹Array的各種方法吧!


上一篇
新手學習JavaScript:day16 - 變數的更新與傳遞(2)
下一篇
新手學習JavaScript:day18 - 陣列的方法
系列文
純新手學習 JavaScript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言